package common

// SPlatObject =================================平台公共结构体====================================
type SPlatObject struct {
	PIndex     string `gorm:"column:m_index;primaryKey;not null" json:"index"` //主键索引
	Name       string `gorm:"column:name;not null" json:"name"`                //名字
	Descr      string `gorm:"column:descr;not null" json:"descr"`              //描述
	CreateTime int64  `gorm:"column:create_time;not null" json:"create_time"`  //创建时间
	Sn         int    `gorm:"column:sn;not null" json:"_"`                     //排序
}

// SDeviceInfo =================================设备信息结构体=================================
type SDeviceInfo struct {
	SPlatObject
	Manufacturer     string       `gorm:"column:manufacturer" json:"manufacturer"`                       // 生产厂家
	Model            string       `gorm:"column:model" json:"model"`                                     // 设备型号
	SerialNumber     string       `gorm:"column:serial_number;not null" json:"serial_number"`            // 设备序列号/识别码
	SoftwareVersion  string       `gorm:"column:software_version" json:"software_version"`               // 软件版本号
	HardwareVersion  string       `gorm:"column:hardware_version" json:"hardware_version"`               // 硬件版本号
	InstallationSite string       `gorm:"column:installation_site" json:"installation_site"`             // 安装位置
	UserIndex        string       `gorm:"column:user_index;not null" json:"user_index"`                  // 所属用户索引
	PushChannelIndex string       `gorm:"column:push_ch_index"`                                          // 推送通道索引
	LastOnlineTime   int64        `gorm:"column:last_online_time" json:"last_online_time"`               // 最后在线时间
	TotalOnlineHours int          `gorm:"column:total_online_hours;default:0" json:"total_online_hours"` // 累计在线时长(小时)
	LastAlarmStatus  EAlarmStatus `gorm:"column:last_alarm_status;default:0" json:"last_alarm_status"`   // 最后告警状态
	IsEnableHistory  EEnAbleState `gorm:"column:is_enable_history;not null" json:"is_enable_history"`    //是否启用历史数据存储
}

func (SDeviceInfo) TableName() string {
	return "device"
}

// SDeviceHistory =================================设备历史状态=================================
type SDeviceHistory struct {
	ID          uint                `gorm:"primaryKey;autoIncrement" json:"id"`                     //自增主键
	DeviceIndex string              `gorm:"column:device_index;index;not null" json:"device_index"` // 所属设备索引
	RecordTime  int64               `gorm:"column:record_time;index;not null" json:"record_time"`   // 记录时间
	IsOnline    bool                `gorm:"column:is_online" json:"is_online"`                      // 是否在线
	AlarmStatus EAlarmStatus        `gorm:"column:alarm_status;default:0" json:"alarm_status"`      // 告警状态
	AlarmLevel  EAlarmLevel         `gorm:"column:alarm_level" json:"alarm_level"`                  // 告警级别
	TriggerType EHistoryTriggerType `gorm:"column:trigger_type;default:0" json:"trigger_type"`      // 触发类型 0:定时 1:事件
	EventReason string              `gorm:"column:event_reason" json:"event_reason"`                // 事件原因描述
}

func (SDeviceHistory) TableName() string {
	return "device_history"
}

// SGroupInfo =================================分组信息结构体=================================
type SGroupInfo struct {
	SPlatObject
	DeviceIndex string `gorm:"column:device_index;not null" json:"device_index"` // 所属设备索引
}

func (SGroupInfo) TableName() string { return "arg_group" }

// SArgumentInfo =================================相关模型定义=================================
type SArgumentInfo struct {
	SPlatObject
	GroupIndex        string          `gorm:"column:group_index;not null" json:"group_index"`             //所属组
	ValueType         EArgValueType   `gorm:"column:value_type;not null" json:"value_type"`               //数据类型
	ArgType           EArgType        `gorm:"column:type;not null" json:"type"`                           //参数类型
	Value             string          `gorm:"column:value;" json:"value"`                                 //数值
	PushType          EArgPushType    `gorm:"column:push_type;not null" json:"push_type"`                 //推送类型
	EnWrite           EArgWriteEnable `gorm:"column:en_write;not null" json:"en_write"`                   //是否使能写
	PushCondition     string          `gorm:"column:push_condition" json:"push_condition"`                //推送条件
	CalculationPlugin string          `gorm:"column:calculation_plugin;" json:"calculation_plugin"`       //计算脚本
	ByteOrder         EByteOrder      `gorm:"column:byte_order;not null" json:"byte_order"`               //字节序
	IsEnableHistory   EEnAbleState    `gorm:"column:is_enable_history;not null" json:"is_enable_history"` //是否启用历史保存
}

func (SArgumentInfo) TableName() string { return "argument" }

// FollowArg =================================参数跟随表=================================
type FollowArg struct {
	PushIndex   string `gorm:"column:push_index;not null" json:"push_index"`
	FollowIndex string `gorm:"column:follow_index;not null" json:"follow_index"`
}

func (FollowArg) TableName() string { return "follow_parameter" }

// SArgumentHistory =================================参数历史数据=================================
type SArgumentHistory struct {
	ID        uint         `gorm:"primaryKey;autoIncrement" json:"id"`
	ArgIndex  string       `gorm:"column:arg_index;index;not null" json:"arg_index"` // 参数索引
	Value     string       `gorm:"column:value;not null" json:"value"`               // 参数值
	Quality   EDataQuality `gorm:"column:quality;default:0" json:"quality"`          // 数据质量 (0:好 1:一般 2:差)
	Timestamp int64        `gorm:"column:timestamp;index;not null" json:"timestamp"` // 记录时间（精确到毫秒）
	Source    EDataSource  `gorm:"column:source;default:0" json:"source"`            // 数据来源 (0:采集 1:手动 2:计算)
}

func (SArgumentHistory) TableName() string {
	return "argument_history"
}

// SCommunicationConfig =================================通信配置表=================================
type SCommunicationConfig struct {
	SPlatObject
	ConfigType string `gorm:"column:config_type;not null" json:"config_type"`           // 配置类型(serial/tcp/mqtt/kafka...)
	ConfigJson string `gorm:"column:config_json;type:json;not null" json:"config_json"` // 类型相关的具体配置(JSON格式)
}

func (SCommunicationConfig) TableName() string { return "communication_config" }

// SPushChannel ================= 推送通道结构 =================
type SPushChannel struct {
	SPlatObject
	TransportType string `gorm:"column:transport_type;not null" json:"transport_type"` // 传输类型(MQTT,Kafka,HTTP,WebSocket...)
	ConfigIndex   string `gorm:"column:config_index" json:"config_index"`              // 关联通信配置的Index
	UpTopic       string `gorm:"column:up_topic" json:"up_topic"`                      // 上行主题
	DownTopic     string `gorm:"column:down_topic" json:"down_topic"`                  // 下行主题
	DataFormat    string `gorm:"column:data_format;default:'json'" json:"data_format"` // 数据格式(json/xml/custom)
}

func (SPushChannel) TableName() string { return "push_channel" }

// SAlarmHistory =================================告警历史记录=================================
type SAlarmHistory struct {
	ID          uint   `gorm:"primaryKey;autoIncrement" json:"id"`
	AlarmID     string `gorm:"column:alarm_id;index;not null" json:"alarm_id"`     // 告警唯一ID
	LinkIndex   string `gorm:"column:link_index;index;not null" json:"link_index"` // 关联设备索引
	AlarmType   int    `gorm:"column:alarm_type;not null" json:"alarm_type"`       // 告警类型（0:设备告警 1:参数告警）
	AlarmValue  string `gorm:"column:alarm_value;not null" json:"alarm_value"`     // 触发告警的值
	AlarmLevel  int    `gorm:"column:alarm_level;not null" json:"alarm_level"`     // 告警等级（0:提示 1:警告 2:严重 3:紧急）
	Description string `gorm:"column:description;not null" json:"description"`     // 告警描述
	StartTime   int64  `gorm:"column:start_time;index;not null" json:"start_time"` // 告警开始时间
	EndTime     int64  `gorm:"column:end_time;index" json:"end_time"`              // 告警结束时间
	Duration    int64  `gorm:"column:duration" json:"duration"`                    // 告警持续时间(秒)
	AlarmCount  int    `gorm:"column:alarm_count;default:1" json:"alarm_count"`    // 告警发生次数
	AckBy       string `gorm:"column:ack_by" json:"ack_by"`                        // 确认人
	AckTime     int64  `gorm:"column:ack_time" json:"ack_time"`                    // 确认时间
	RecoveryBy  string `gorm:"column:recovery_by" json:"recovery_by"`              // 恢复人（如果是手动恢复）
	RecoveryWay int    `gorm:"column:recovery_way;default:0" json:"recovery_way"`  // 恢复方式 (0:自动恢复 1:手动恢复)
}

func (SAlarmHistory) TableName() string { return "alarm_history" }

// SUser =================================用户表=================================
type SUser struct {
	SPlatObject
	Username  string `gorm:"column:username;unique;not null" json:"username"` //用户名
	Password  string `gorm:"column:password;not null" json:"-"`               //密码
	Email     string `gorm:"column:email" json:"email"`                       //邮箱
	Phone     string `gorm:"column:phone" json:"phone"`                       //手机号
	LastLogin int64  `gorm:"column:last_login" json:"last_login"`             //最后登录时间
	IsActive  bool   `gorm:"column:is_active;default:true" json:"is_active"`  //是否禁用
	IsAdmin   bool   `gorm:"column:is_admin;default:false" json:"is_admin"`   // 是否为管理员
}

func (SUser) TableName() string { return "users" }

// SDevicePermission =================================设备权限表=================================
type SDevicePermission struct {
	ID          uint             `gorm:"primaryKey;autoIncrement" json:"id"`
	DeviceIndex string           `gorm:"column:device_index;index;not null" json:"device_index"` // 设备索引
	UserIndex   string           `gorm:"column:user_index;index;not null" json:"user_index"`     // 用户索引
	Permission  EPermissionLevel `gorm:"column:permission;default:1" json:"permission"`          // 权限级别 (1:只读 2:读写 3:管理)
}

func (SDevicePermission) TableName() string { return "device_permission" }

// SOperationLog =================================操作日志表=================================
type SOperationLog struct {
	ID        uint   `gorm:"primaryKey;autoIncrement" json:"id"`
	UserIndex string `gorm:"column:user_index;index;not null" json:"user_index"` // 操作用户索引
	OpTime    int64  `gorm:"column:op_time;index;not null" json:"op_time"`       // 操作时间
	Module    string `gorm:"column:module;index;not null" json:"module"`         // 操作模块
	Operation string `gorm:"column:operation;not null" json:"operation"`         // 操作类型
	Detail    string `gorm:"column:detail;type:json;not null" json:"detail"`     // 操作详情(JSON)
	Result    int    `gorm:"column:result;default:1" json:"result"`              // 操作结果 (0:失败 1:成功)
}

func (SOperationLog) TableName() string { return "operation_log" }

// SProtocolInfo ================= 采集通道结构 =================
type SProtocolInfo struct {
	SPlatObject
	State       EEnAbleState  `gorm:"column:state;not null;" json:"state"`
	DeviceIndex string        `gorm:"column:device_index;index;not null" json:"device_index"` // 设备
	ConfigIndex string        `gorm:"column:config_index" json:"config_index"`                // 关联通信配置的Indexd
	Type        EProtocolType `gorm:"column:type;not null" json:"type"`
}

func (SProtocolInfo) TableName() string { return "protocol_info" }

// SModbusPoints =================================Modbus映射表=================================
type SModbusPoints struct {
	ProtocolIndex string              `gorm:"column:protocol_index;not null" json:"protocol_index"` //所属协议对象
	AgrIndex      string              `gorm:"column:agr_index;not null" json:"agr_index"`           //参数索引
	Type          EModbusRegisterType `gorm:"column:type;not null" json:"type"`                     //寄存器类型
	SlaveId       int                 `gorm:"column:slave_id;not null" json:"slave_id"`             //从机ID
	Address       uint16              `gorm:"column:address;not null" json:"address"`               //地址
	Base          float32             `gorm:"column:base;default:0" json:"base"`                    //基数
	Coef          float32             `gorm:"column:coef;default:1 " json:"coef"`                   //系数
	Offset        int                 `gorm:"column:offset;default:0" json:"offset"`                //偏移
	Length        int                 `gorm:"column:length;default:0" json:"length"`                //长度
	Interval      int                 `gorm:"column:interval;default:100" json:"interval"`          //采集间隔，毫秒
	Priority      int                 `gorm:"column:priority;default:0" json:"priority"`            //采集优先级
}

func (SModbusPoints) TableName() string { return "modbus_points" }
